﻿using System;
using System.Collections.Generic;
using System.IO;
using ImageResizer.FileExplorer.Interface;

namespace ImageResizer.FileExplorer.Implementations
{
    public class LocalFileExplorer : IFileExplorer
    {
        /// <summary>
        /// Obtient la liste des fichiers contenus dans le repertoire
        /// </summary>
        /// <param name="rootDirectory">le répertoire à lister</param>
        /// <returns>la liste des fichiers</returns>
        public IEnumerable<string> DirectoryListFiles(string rootDirectory)
        {
            return Directory.GetFiles(rootDirectory);
        }

        /// <summary>
        /// Obtient la liste des fichiers contenus dans le repertoire
        /// </summary>
        /// <param name="rootDirectory">le répertoire à lister</param>
        /// <param name="searchPattern">le pattern de recherche</param>
        /// <returns>la liste des fichiers</returns>
        public IEnumerable<string> DirectoryListFiles(string rootDirectory, string searchPattern)
        {
            return Directory.GetFiles(rootDirectory, searchPattern);
        }

        /// <summary>
        ///  Obtient la liste des dossiers contenus dans le repertoire
        /// </summary>
        /// <param name="rootDirectory">le répertoire à lister</param>
        /// <returns>la liste des sous-dossiers</returns>
        public IEnumerable<string> DirectoryListSubDirs(string rootDirectory)
        {
            return Directory.GetDirectories(rootDirectory);
        }

        /// <summary>
        ///  Obtient la liste des dossiers contenus dans le repertoire
        /// </summary>
        /// <param name="rootDirectory">le répertoire à lister</param>
        /// <param name="searchPattern">le pattern de recherche</param>
        /// <returns>la liste des sous-dossiers</returns>
        public IEnumerable<string> DirectoryListSubDirs(string rootDirectory, string searchPattern)
        {
            return Directory.GetDirectories(rootDirectory, searchPattern);
        }

        /// <summary>
        /// Créé un dossier
        /// </summary>
        /// <param name="dirpath">le chemin à créer</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        public bool DirectoryCreate(string dirpath)
        {
            return Directory.CreateDirectory(dirpath).Exists;
        }

        /// <summary>
        /// Supprime un dossier
        /// </summary>
        /// <param name="dirpath">le chemin à supprimer</param>
        /// <param name="recursively">si true efface le dossier ansi que son contenu (fichiers + subdirs), si false efface si vide</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        public bool DirectoryDelete(string dirpath, bool recursively)
        {
            Directory.Delete(dirpath, recursively);
            return !DirectoryExists(dirpath);
        }

        /// <summary>
        /// Indique si un répertoire existe
        /// </summary>
        /// <param name="dirpath">le répertoire à tester</param>
        /// <returns>true si le répertoire existe, false sinon</returns>
        public bool DirectoryExists(string dirpath)
        {
            return Directory.Exists(dirpath);
        }

        /// <summary>
        /// Supprime un fichier
        /// </summary>
        /// <param name="filepath">le chemin complet du fichier à supprimer</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        public bool FileDelete(string filepath)
        {
            File.Delete(filepath);
            return !FileExists(filepath);
        }

        /// <summary>
        /// Indique si un fichier existe
        /// </summary>
        /// <param name="filepath">le fichier à tester</param>
        /// <returns>true si le fichier existe, false sinon</returns>
        public bool FileExists(string filepath)
        {
            return File.Exists(filepath);
        }

        /// <summary>
        /// Télécharge un fichier
        /// </summary>
        /// <param name="source">la source à télécharger</param>
        /// <param name="destination">la destination</param>
        /// <param name="overwrite">indique si on écrase le fichier destination s'il existe déjà</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        public bool FileDownload(string source, string destination, bool overwrite)
        {
            File.Copy(source, destination, overwrite);
            return FileExists(destination);
        }

        /// <summary>
        /// Envoi un fichier
        /// </summary>
        /// <param name="source">le chemin du fichier à envoyer</param>
        /// <param name="destination">la destination</param>
        /// <param name="overwrite">indique si on écrase le fichier destination s'il existe déjà</param>
        /// <returns>le résultat de l'opération (true:ok, fasle:erreur)</returns>
        public bool FileUpload(string source, string destination, bool overwrite)
        {
            File.Copy(source, destination, overwrite);
            return FileExists(destination);
        }

        /// <summary>
        /// Obtient le caractère de séparation des chemins
        /// </summary>
        public string PathSeparator
        {
            get { return "\\"; }
        }
    }
}
